//强制受力移动
let SWDA_FocedMove = {};

SWDA_FocedMove.Game_AnalogMove_initialize = Game_AnalogMove.prototype.initialize;
Game_AnalogMove.prototype.initialize = function (thisCharacter) {
    SWDA_FocedMove.Game_AnalogMove_initialize.call(this, thisCharacter);
    this._isForcedMoving = false;           // 是否强制受力（默认：false）
    this._forceRate = 0;                    // 强制受力的强弱（默认：0。大于1：只能减缓移动；小于1：可反向移动；等于1：只能暂停移动；等于0：无力；小于0：反向力）
    this._forceRadian = undefined;          // 默认：undefined; 向左：Math.PI/2; 向右：3 * Math.PI / 2; 向上：0; 向下：Math.PI; 
    this._isControling = false;             // 是否正在控制移动（默认：false）
};

Game_AnalogMove.prototype.setForceRate = function (value) {
    this._forceRate = value;
}
Game_AnalogMove.prototype.setForceRadian = function (value) {
    this._forceRadian = value;
}
Game_AnalogMove.prototype.resetForce = function (value) {
    this._forceRate = 0;
    this._forceRadian = undefined;
}


SWDA_FocedMove.Game_AnalogMove_moveByInput = Game_AnalogMove.prototype.moveByInput;
Game_AnalogMove.prototype.moveByInput = function (thisCharacter) {
    SWDA_FocedMove.Game_AnalogMove_moveByInput.call(this, thisCharacter);
    var stick = Input.leftStick();

    // 触摸/点击：确定触摸目的地坐标
    if (TouchInput.isTriggered() || TouchInput.isRepeated()) {
        this._isControling = true;
    }
    // 摇杆：目的地角度=摇杆角度。移动速度：摇杆推动程度。
    if (stick !== undefined && stick.tilt !== 0.0) {
        this._isControling = true;
    // 键盘方向键：目的地角度=方向键角度。移动速度：默认角色帧速度。
    } else if (this.dir8ToRadian(Input.dir8) !== undefined) {
        this._isControling = true;
    // 【触摸/点击屏幕情况】目的地坐标 有定义。则根据目的地确定方向，移动速度：根据距离远近计算。如果到达目的地，则清空目的地坐标。
    } else if (this._targRealX !== undefined && this._targRealY !== undefined) {
        this._isControling = true;
    } else {
        this._distancePerFrame = 0.0;
        this._isControling = false;
    }
    // 根据受力系数自动判断是否强制移动。
    if (this._forceRate === 0){
        this._isForcedMoving = false;
    }else{
        this._isForcedMoving = true;
    }
    if (this._isForcedMoving){
        
        // 新的目的地方向向量
        // 玩家不控制移动时，速度和方向只与所受强制力有关。（不能喝下面情况统一，否则会因计算误差产生“惯性”bug）
        if (!this._isControling){
            this._targetRadian = this._forceRadian;
            this._distancePerFrame = this._forceRate * 0.125;     //不控制移动时受力产生的标准速度，该速度由标准跑步速度（0.125）计算。
        } else {
            // 额外受力产生的向量长度（速度）与玩家速度无关。该速度增量由标准跑步速度（0.125）计算。
            var newTargetX = -(this._forceRate * Math.sin(this._forceRadian) * 0.125 / this._distancePerFrame + Math.sin(this._targetRadian));
            var newTargetY = -(this._forceRate * Math.cos(this._forceRadian) * 0.125 / this._distancePerFrame + Math.cos(this._targetRadian));
            var newRadian = 0;
            var newRate = 0;
            // 新方向
            if (newTargetX === 0.0) {
                if ( newTargetY !== 0 ){
                    newRadian = (-newTargetY > 0 ? Math.PI * 0.0 : Math.PI * 1.0);
                }
            } else if (newTargetY === 0.0) {
                newRadian = (-newTargetX > 0 ? Math.PI * 0.5 : Math.PI * 1.5);
            } else {
                newRadian = Math.atan2(-newTargetX, -newTargetY);
            }
            // 新速度（加速倍数上限是1.5）
            newRate = Math.min(Math.sqrt(Math.pow(newTargetX,2) + Math.pow(newTargetY,2)) ,1.5);
            // 更新方向和速度。
            this._targetRadian = newRadian;
            this._distancePerFrame = this._distancePerFrame * newRate;
        }
    }

    // 玩家不控制移动时，行走图不变（滑行）。控制移动时，播放行走动画。
    if (this._isControling){
        thisCharacter.setWalkAnime(true);
    } else if (this._isForcedMoving){
        thisCharacter.setWalkAnime(false);
    }

};
